﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Configuration;
using TCC_Hotel.Entidades;
using System.Globalization;

namespace TCC_Hotel.Repositorio
{
    public class ContaRepositorio
    {
        ControleBancoDados controle = new ControleBancoDados();

        /// <summary>
        /// Recupera o total da conta de um hospede
        /// </summary>
        /// <param name="CPF">ID da reserva</param>
        /// <returns>Total da conta do hospede</returns>
        public double RecuperarTotalConta(int ID)
        {
            double resposta = 0;
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "Select sum(Preco) as Total from Contas where ID=" + ID;

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados
                while (reader.Read())
                {
                    if (!Double.TryParse(reader["Total"].ToString(), out resposta))
                    {
                        resposta = 0;
                    }        
                }

                //fecha a conexao
                con.Close();


            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados
                    while (reader.Read())
                    {
                        if (!Double.TryParse(reader["Total"].ToString(), out resposta))
                        {
                            resposta = 0;
                        }
                    }
                    
                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;


        }

        /// <summary>
        /// Recupera o total da conta que o hospede pagou no heckout
        /// </summary>
        /// <param name="CPF">ID da reserva</param>
        /// <returns>Total da conta paga pelo hospede</returns>
        public double RecuperarTotalContaPagaCheckOut(int ID)
        {
            double resposta = 0;
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "Select sum(Preco) as Total from Contas where ID= " + ID + "AND Pagamento = 'false'";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados
                while (reader.Read())
                {
                    if (!Double.TryParse(reader["Total"].ToString(), out resposta))
                    {
                        resposta = 0;
                    }
                }

                //fecha a conexao
                con.Close();


            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados
                    while (reader.Read())
                    {
                        if (!Double.TryParse(reader["Total"].ToString(), out resposta))
                        {
                            resposta = 0;
                        }
                    }

                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;
        }

        /// <summary>
        /// Cria o comando SQL e envia para um método cancelar uma venda dos bancos de dados
        /// </summary>        
        /// <param name="apartamento">data e hora da venda</param>
        /// <returns>true se cancelou ou false se não</returns>
        public bool CancelarVenda(DateTime Data, string Descricao, double Preco)
        {
            string preco = Preco.ToString(CultureInfo.InvariantCulture);

            //definição do comando sql
            string sql =
                "DELETE FROM Contas WHERE Data = '" + Data + "'";

            sql = sql + " INSERT INTO Balanco_Financeiro VALUES ('" +
                "Cancelamento da venda de " + Descricao + "', " +
                preco + ", '" +
                Data + "', '" +
                false + "')";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Cria o comando SQL e envia para um método inserir um nova venda nos bancos de dados
        /// </summary>
        /// <param name="conta">Entidade con ta</param>
        /// <returns>true se inseriu ou false se não</returns>
        public bool CadastrarVenda(Conta conta)
        {
            string preco = conta.Preco.ToString(CultureInfo.InvariantCulture);

            //definição do comando sql
            string sql =
                "INSERT INTO Contas VALUES (" +
                conta.ID + ", '" +
                conta.Descricao + "', " +
                preco + ", '" +
                conta.Data + "', '" +
                conta.Pagamento + "', '" +
                conta.isProduto + "')";

            if (conta.Pagamento)
            {
                sql = sql + " INSERT INTO Balanco_Financeiro VALUES ('" +
                    "Venda de " + conta.Descricao + "', " +
                    preco + ", '" +
                    conta.Data + "', '" +
                    true + "')";
            }
            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Recupera todas as contas de um fluxo especifico do banco de dados
        /// </summary>
        /// <param name="CPF">ID do fluxo</param>
        /// <returns>Lista com as contas</returns>
        public List<Conta> RecuperarVendasProdutoFluxo(int ID)
        {
            List<Conta> resposta = new List<Conta>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Contas WHERE ID = '" + ID + "' AND isProduto = 1";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto empresa
                resposta = ListarContas(reader);

                //fecha a conexao
                con.Close();


            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();


                    //le os dados retornados e monta objeto empresa
                    resposta = ListarContas(reader);


                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;


        }

        /// <summary>
        /// Recupera todas as contas dos fluxos ativos do banco de dados
        /// </summary>
        /// <param name="CPF">ID do fluxo</param>
        /// <returns>Lista com as contas</returns>
        public List<Conta> RecuperarVendasProduto()
        {
            List<Conta> resposta = new List<Conta>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;

            //definição do comando sql
            string sql =
                "SELECT c.ID,c.Descricao,c.Data,c.isProduto,c.Pagamento,c.Preco,c.Descricao FROM Contas c " +
                "inner join Fluxo_Hospedes f on f.ID = c.ID where f.NoHotel=1 AND c.isProduto=1";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto empresa
                resposta = ListarContas(reader);

                //fecha a conexao
                con.Close();


            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();


                    //le os dados retornados e monta objeto empresa
                    resposta = ListarContas(reader);


                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;


        }

        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando a lista que é retornada
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public List<Conta> ListarContas(SqlDataReader reader)
        {
            List<Conta> listaResposta = new List<Conta>();

            //le os dados retornados
            while (reader.Read())
            {
                listaResposta.Add(new Conta()
                {
                    ID = Convert.ToInt32(reader["ID"]),
                    Descricao = Convert.ToString(reader["Descricao"]),
                    Preco = Convert.ToDouble(reader["Preco"]),
                    Data = Convert.ToDateTime(reader["Data"]),
                    Pagamento = Convert.ToBoolean(reader["Pagamento"]),
                    isProduto = Convert.ToBoolean(reader["isProduto"])
                   
                });

            }

            return listaResposta;
        }
    }
}